﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace Ultility
{
    public partial class DBAccess : Component
    {
        public DBAccess()
        {
            InitializeComponent();
        }

        public DBAccess(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }

        private SqlConnection _Getconection()
        {
            //string connstring = @"Data Source=.\SQLEXPRESS;Initial Catalog=QLKS;Integrated Security=True";
            string connstring = @"Data Source=MrTeo-PC;Initial Catalog=QLKS2;Integrated Security=True";
            return new SqlConnection(connstring);
        }

        public bool _ExcuteReader(string query)
        {
            bool res = false;

            SqlConnection conn = _Getconection();
            try
            {

                conn.Open();
                SqlCommand cmd = new SqlCommand(query, conn);

                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                    res = true;
            }
            catch (SqlException)
            {


            }
            finally
            {
                conn.Close();
            }
            return res;
        }

        public bool _ExcuteNonQuery(string _storename, params SqlParameter[] _param)
        {
            bool res = false;
            //Tạo kết nối
            SqlConnection conn = _Getconection();
            //Mở kết nối để bắt đầu transaction
            conn.Open();

            //Bắt đầu Transaction
            SqlTransaction myTran = conn.BeginTransaction();

            //Khối lệnh của Transaction
            try
            {
                //Tạo 1 câu lệnh đê thực thi store
                SqlCommand cmd = new SqlCommand();

                //Kết nối của command
                cmd.Connection = conn;
                //Transaction của command
                cmd.Transaction = myTran;
                //Kiểu command là thực thi store procedure
                cmd.CommandType = CommandType.StoredProcedure;

                //Kiểm tra tham số truyền vào
                //nếu có 
                if (_param != null)
                {
                    //Xóa tham số hiện có của commmand
                    cmd.Parameters.Clear();
                    //và add vô mảng tham số là tham số truyền vào của hảm
                    cmd.Parameters.AddRange(_param);
                }
                //Nếu tham số null
                else
                {
                    //không thực thi được và trả về false, thoát khổi hàm.
                    return false;
                }

                //Tên của store để command thực thi
                cmd.CommandText = _storename;
                //ExcuteNonQuery với các lệnh insert, update, delete  
                int n = (int)cmd.ExecuteNonQuery();
                if (n != 0) res = true;
                myTran.Commit();

                ////giá trị trả về là true. thực thi thành công
                //Transaction thực thi tất cả khi gặp lệnh Commit()
                //Tức là transaaction được thực thi thành công
                //myTran.Commit();
            }
            //Nếu gặp lỗi
            catch (SqlException)
            {
                //Lệnh rollback sẽ trả lại trạng thái chưa thực thi của giao dịch.
                //Điều này đảm bảo ko làm ảnh huongwr tới dữ liệu khi giao dịch bị lỗi.

                myTran.Rollback();
                res = false;
            }
            finally
            {
                //Đóng kết nối của CSDL
                conn.Close();
            }
            //Giá trị trả về
            return res;
        }

        public bool _ExcuteNonQuerySelect(string store, params SqlParameter[] _param)
        {
            bool res = false;
            //Tạo kết nối
            SqlConnection conn = _Getconection();
            //Mở kết nối để bắt đầu transaction
            conn.Open();

            //Bắt đầu Transaction
            SqlTransaction myTran = conn.BeginTransaction();

            //Khối lệnh của Transaction
            try
            {
                //Tạo 1 câu lệnh đê thực thi store
                SqlCommand cmd = new SqlCommand();

                //Kết nối của command
                cmd.Connection = conn;
                //Transaction của command
                cmd.Transaction = myTran;
                //Kiểu command là thực thi store procedure
                cmd.CommandType = CommandType.StoredProcedure;

                //Kiểm tra tham số truyền vào
                //nếu có 
                if (_param != null)
                {
                    //Xóa tham số hiện có của commmand
                    cmd.Parameters.Clear();
                    //và add vô mảng tham số là tham số truyền vào của hảm
                    cmd.Parameters.AddRange(_param);
                }
                //Nếu tham số null
                else
                {
                    //không thực thi được và trả về false, thoát khổi hàm.
                    return false;
                }

                //Tên của store để command thực thi
                cmd.CommandText = store;
                                
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                    res = true;

                //Transaction thực thi tất cả khi gặp lệnh Commit()
                //Tức là transaaction được thực thi thành công
                //myTran.Commit();
            }
            catch (SqlException)
            {
                //Lệnh rollback sẽ trả lại trạng thái chưa thực thi của giao dịch.
                myTran.Rollback();
                res = false;
            }
            finally
            {
                //Đóng kết nối của CSDL
                conn.Close();
            }
            //Giá trị trả về
            return res;
        }

        public DataSet _ExcuteQuery(string store, params SqlParameter[] _param)
        {
            DataSet data = new DataSet();
            SqlDataAdapter dta = new SqlDataAdapter();
            SqlConnection conn = _Getconection();
            conn.Open();
            
            
            SqlTransaction myTran = conn.BeginTransaction();
            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.Transaction = myTran;
                cmd.CommandType = CommandType.StoredProcedure;
                if (_param != null)
                {
                    //Xóa tham số hiện có của commmand
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(_param);
                }
                cmd.CommandText = store;
                dta.SelectCommand = cmd;
                dta.Fill(data);
                myTran.Commit();
            }
            //Nếu gặp lỗi
            catch (SqlException)
            {
                myTran.Rollback();            
            }
            finally
            {
                conn.Close();
            }
            //Giá trị trả về
            return data;
        }
    }
}
